package org.i0o.webplus.dao.impl.hibernate3;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 集成spring的HibernateDaoSupport，并扩展其功能泛型操作
 * 
 * @author <a href="mailto:781131@gmail.com">HTF</a>
 */
public abstract class BaseHibernateDao extends HibernateDaoSupport {
	/**
	 * 日志对象. 在子类中不必单独定义日志对象，直接使用这里生成的即可
	 */
	protected final Logger log = LoggerFactory.getLogger(this.getClass());

	/**
	 * 根据ID删除对象
	 * 
	 * @param clazz 泛型对象
	 * @param id id
	 */
	protected void genericDeleteById(Class<?> clazz, Serializable id) {
		super.getHibernateTemplate().delete(this.genericGet(clazz, id));
	}

	/**
	 * 根据ID获取对象
	 * 
	 * @param clazz 泛型对象
	 * @param id ID
	 */
	protected Object genericGet(Class<?> clazz, Serializable id) {
		return super.getHibernateTemplate().get(clazz, id);
	}

	/**
	 * 获取全部对象.
	 * 
	 * @param entityClass 泛型T的类型
	 * @return 全部对象的List
	 */
	protected List<?> genericGetAll(Class<?> entityClass) {
		return getHibernateTemplate().loadAll(entityClass);
	}

	/**
	 * 生成hibernate查询对象
	 * 
	 * @param hql hql语句字符串
	 * @param values 值
	 * @return Query查询对象
	 */
	protected Query createQuery(String hql, Object... values) {
		Query query = super.getSession().createQuery(hql);
		if (values != null) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i, values[i]);
			}
		}
		return query;
	}

	/**
	 * 生成hibernate查询对象
	 * 
	 * @param hql hql语句字符串
	 * @param values 值
	 * @return Query查询对象
	 */
	protected Query createQuery(StringBuffer hql, Object... values) {
		return this.createQuery(hql.toString(), values);
	}

	/**
	 * 根据sql语句名称创建查询对象
	 * 
	 * @param sqlName
	 * @param values
	 * @return
	 */
	protected Query getNamedQuery(String sqlName, Map<String, Object> values) {
		Query query = super.getSession().getNamedQuery(sqlName);
		query.setProperties(values);

		return query;
	}

	/**
	 * 生成hibernate查询对象，支持匿名参数
	 * 
	 * @param hql hql语句字符串
	 * @param values 参数集合
	 * @return Query查询对象
	 */
	protected Query createQuery(String hql, Map<String, Object> values) {
		Query query = this.createQuery(hql);
		if (values != null) {
			query.setProperties(values);
		}
		return query;
	}

	/**
	 * 生成hibernate查询对象，支持匿名参数
	 * 
	 * @param hql hql语句字符串
	 * @param values 参数集合
	 * @return Query查询对象
	 */
	protected Query createQuery(StringBuffer hql, Map<String, Object> values) {
		return this.createQuery(hql.toString(), values);
	}

	/**
	 * 生成hibernate查询对象(SQL)
	 * 
	 * @param hql hql语句字符串
	 * @param objects 参数集合
	 * @return Query查询对象
	 */
	protected Query createSQLQuery(String sql, Object... objects) {
		Query query = super.getSession().createSQLQuery(sql);
		if (objects != null) {
			for (int i = 0; i < objects.length; i++) {
				query.setParameter(i, objects[i]);
			}
		}
		return query;
	}

	/**
	 * 生成hibernate查询对象(SQL)
	 * 
	 * @param hql hql语句字符串
	 * @param objects 参数集合
	 * @return Query查询对象
	 */
	protected Query createSQLQuery(StringBuffer sql, Object... objects) {
		return this.createSQLQuery(sql.toString(), objects);
	}

	/**
	 * 生成hibernate查询对象，支持匿名参数(SQL)
	 * 
	 * @param hql hql语句字符串
	 * @param values 参数集合
	 * @return Query查询对象
	 */
	protected Query createSQLQuery(String sql, Map<String, Object> values) {
		Query query = this.createSQLQuery(sql);
		if (values != null) {
			query.setProperties(values);
		}
		return query;
	}

	/**
	 * 生成hibernate查询对象，支持匿名参数(SQL)
	 * 
	 * @param hql hql语句字符串
	 * @param values 参数集合
	 * @return Query查询对象
	 */
	protected Query createSQLQuery(StringBuffer sql, Map<String, Object> values) {
		return this.createSQLQuery(sql.toString(), values);
	}
}
